// $Id: Qt.cpp 120 2007-11-16 18:08:56Z wimleers $


/**
 * Qt interface definition file.
 *
 * @file Qt.cpp
 * @author Wim Leers
 */


#include <string>
using namespace std;
#include <QApplication>
#include <QMessageBox>
#include "Qt.h"
#include "Piece.h"


//----------------------------------------------------------------------------
// Constructor & destructor.

QtGui::QtGui(int argc, char ** argv) {
	QApplication app(argc, argv);

	// Toon het main window.
	m_mainWindow = new ReversiMainWindow();
	m_mainWindow->show();

	// Verbind alle knoppen.
	for (unsigned int x = 0; x < ReversiMainWindow::GRID_SIZE; x++)
		for (unsigned int y = 0; y < ReversiMainWindow::GRID_SIZE; y++)
			connect(m_mainWindow->GetButton(x, y), SIGNAL(ClickedButtonWithCoords(int, int)), SLOT(CatchMove(int, int)));

	app.exec();
}

QtGui::~QtGui(void) {
	if (m_game != NULL)
		delete m_game; 
}


//----------------------------------------------------------------------------
// Public methods.

/**
 * Tekent het spelbord opnieuw.
 *
 * @author Wim Leers
 */
void QtGui::DrawBoard(void) const {
	Board board = m_game->GetBoard();

	// Kleuren van alle ReversiButtons updaten.
	for (int x = 0; x < board.GetSize(); x++) {
		for (int y = 0; y < board.GetSize(); y++) {
			if (board.GetPiece(x, y) == BLACK)
				m_mainWindow->GetButton(x, y)->setIcon(QIcon("icons/black.png"));
			else if (board.GetPiece(x, y) == WHITE)
				m_mainWindow->GetButton(x, y)->setIcon(QIcon("icons/white.png"));
			else
				m_mainWindow->GetButton(x, y)->setIcon(QIcon("icons/empty.png"));
		}
	}
}


//----------------------------------------------------------------------------
// Private methods.

/**
 * Het spel is afgelopen. Update de Player objecten, sla de DB op en toon het
 * resultaat.
 *
 * @author Wim Leers
 */
void QtGui::EndGame(void) const {
	int p1Pieces = m_game->CountPieces(BLACK);
	int p2Pieces = m_game->CountPieces(WHITE);
	string message = "Het spel is afgelopen!\n\n";

	// Laatste keer het spelbord updaten.
	DrawBoard();

	// Update de speler objecten en bouw het bericht verder op.
	/*
	 m_p1->IncreasePlays();
	m_p2->IncreasePlays();
	if (p1Pieces > p2Pieces) {
		message += "Speler 1 wint!" + endl;
		m_p1->IncreaseVictories();
	}
	else if (p2Pieces > p1Pieces) {
		message += "Speler 2 wint!" + endl;
		m_p2->IncreaseVictories();
	}
	else
		message += "Gelijkspel" + endl;

	// Sla de DB van spelers op.
	m_db.Save();
	*/

	// Voeg ook nog de exacte eindstand toe aan het bericht.
	message += "\n";
	message += "Speler 1: " + QString::number(p1Pieces).toStdString() + " stukken.\n";
	message += "Speler 2: " + QString::number(p2Pieces).toStdString() + " stukken.\n";
	
	// Toon het opgebouwde bericht.
	QMessageBox::information(m_mainWindow, "Spel afgelopen", message.c_str());
}



//----------------------------------------------------------------------------
// Public Qt slots.

/**
 * Een zet is gekozen door de speler.
 *
 * @author Wim Leers
 */
void QtGui::CatchMove(int x, int y) {
	int foo = 2;
	/*
	bool moveMade = m_game->TryPieceMove(speler, x, y, false);

	if (moveMade) {
	  // De zet was mogelijk, voer de zet nu ook echt uit.
	  m_game->TryPieceMove(speler, x, y, true);

		// Teken het bord opnieuw.
		DrawBoard();

		// Wissel de actieve speler.
		// TODO: ook tonen wie de actieve speler is in de GUI?
		// TODO: gebruik GetActive() enzo
		if (m_game->BothMovePossible()) {
			if (m_game->ValidMovePossible(BLACK))
				m_active = 1;
			else
				m_active = 2;
		}
		else
			EndGame();
	}
	*/
}
